2.25~2.29Readme
정교한 문자열 조작을 위해 템플릿 리터럴 타입 조작하자
- 템플릿 리터럴 타입은
백틱과보간을 사용한다.
type Literal = "literal";
type Template = `template ${Literal}`;
const str : Template = 'template literal'
const str = 'template 123'/ 에러 발생
- 정해진 문자열만 변수에 대입할 수 있음을 알 수 있다.
추가적인 타입 검사에는 satisfies 연산자를 사용
satisfies연산자는 타입 추론을 그대로 활용하면서 타입 검사를 하고 싶을 때 사용한다.
const universe = {
sun: "star",
sriius: "star",
earth: { type: "planet", parent: "sun" },
};
- 위 예제서 오타를 잡기 위해
인덱스 시그니처를 활용할 수 있다.
const univers: {
[key in "sun" | "sirius" | "earth"]:
| { type: string; partent: string }
| string;
};
- 다만 위 경우 속성 값을 사용시 객체로 타입을
유니온으로 사용해 문자열일수도 있다 판단하여 오류가 발생한다. - 이떄
satisfies연산자를 사용하면 타입추론은 그대로가며 오타를 발견할 수 있다.
타입 스크립트는 건망증이 심하다.
try {} catch(
if(error as Error)
{
error.message
}
)
- 위 경우 if 문안에서 as로 강제 주장 시 잠시
Error`` 타입으로 추론 후unknown` 돌리는 문제가 발생한다. - 이를 해결하기 위해
Error는 클래스 인스턴스임으로instanseof를 사용할 수 있다.
원시자료형에도 브랜딩 기법을 사용할 수 있다.
function kmToMile (km : number)
{
return km * 0.62;
}
const mile = kmToMile(3)
- 이 경우 숫자가 킬로미터 인지 마일 단위인지 알 수 없다.
- 이 때 브랜딩 기법을 사용해서 더욱 구체적으로 타입을 정할 수 있다.
type Brand<T,B> = T & {_brand: B};
type KM = Brand<number, "km">;
type Mile = Brand<number, "mile>
- 이를 이용하여
KM과MILE타입을 알 수 있다.